/*
 * File : led.c
 *
 */
#include "led.h"
#include "task.h"
#include "memory.h"


#define FLASH_ON	0
#define FLASH_OFF	1
#define FLASH_NEXT	2

void bt_led_on(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
    
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
    GPIO_ResetBits(GPIOE, GPIO_Pin_2);
}

void pw_led_on(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
    
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
    GPIO_ResetBits(GPIOE, GPIO_Pin_3);
}

void gps_led_on(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
    GPIO_ResetBits(GPIOE, GPIO_Pin_4);
}

void bt_led_off(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
    
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
    GPIO_SetBits(GPIOE, GPIO_Pin_2);
}

void pw_led_off(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
    
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
    GPIO_SetBits(GPIOE, GPIO_Pin_3);
}

void gps_led_off(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
    GPIO_SetBits(GPIOE, GPIO_Pin_4);
}

/*
static void gps_led_io_off(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	GPIO_ResetBits(GPIOE, GPIO_Pin_4);
	
}

static void gps_led_io_on(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
    GPIO_SetBits(GPIOE, GPIO_Pin_4);
}
*/

/*
void LED_PWR_On(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	TIM_Cmd(TIM3, ENABLE);
	gps_led_io_on();	
}
void LED_PWR_Off(void)
{
	gps_led_io_off();
	//TIM_Cmd(TIM3, DISABLE);
	//RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE);
}
*/


void LED_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
    
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
    GPIO_SetBits(GPIOE, GPIO_Pin_2);

    
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	GPIO_SetBits(GPIOE, GPIO_Pin_3);
    
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	GPIO_SetBits(GPIOE, GPIO_Pin_4);
}

static unsigned char GPS_LED_On_Time;
static unsigned char GPS_LED_Interval;
static unsigned char gps_led_state;
static unsigned char gps_on_time;
static unsigned char gps_interval_time;

static void GPS_LED_Flash_Task(void)
{	
	switch (gps_led_state)
	{
	case FLASH_ON:
		//LED_PWR_On();
		gps_led_on();
		gps_led_state = FLASH_OFF;
		break;
	case FLASH_OFF:
		//LED_PWR_Off();
		gps_led_off();
		gps_on_time--;
		if (gps_on_time == 0)
		{
			gps_interval_time = GPS_LED_Interval;
			gps_led_state = FLASH_NEXT;
		}
		else
			gps_led_state = FLASH_ON;
		break;
	case FLASH_NEXT:
		gps_interval_time--;
		if (gps_interval_time == 0)
		{
			gps_led_state = FLASH_ON;
			gps_on_time = GPS_LED_On_Time;
		}
		break;
	}	
}

void GPS_LED_On(void)
{
	//LED_PWR_On();
	gps_led_on();
	TaskDel(GPS_LED_Flash_Task);
}

void GPS_LED_Flash(unsigned char flash, unsigned char interval)
{
	//LED_PWR_Off();
	gps_led_off();
	GPS_LED_On_Time	= flash;
	GPS_LED_Interval	= (interval * 10) - (flash * 2);
	gps_led_state = FLASH_ON;
	gps_on_time = GPS_LED_On_Time;
	TaskAdd(GPS_LED_Flash_Task, 10);
}
void GPS_LED_Off(void)
{
	//LED_PWR_Off();
	gps_led_off();
	TaskDel(GPS_LED_Flash_Task);
}

int led_state = 0;
void LED_TEST_Task(void)
{
    switch(led_state)
    {
    case 0:
        gps_led_off();
        bt_led_on();
        led_state++;
        break;
    case 1:
        bt_led_off();
        pw_led_on();
        led_state++;
        break;
    case 2:
        pw_led_off();
        gps_led_on();
        led_state = 0;
        break;
    default:
        led_state = 0;
        break;
    }
}
